import axios from 'axios';
import { MessagePlugin } from "tdesign-react";
import queryString from "query-string";
import {HOST} from "./apis";
import {logout} from "./login";

const noLoginError: {
    code: -1
    errorMsg: string
} = {
    code: -1,
    errorMsg: 'should login'
}

const errorMsg: Record<number, string> = {
    1000: '访问未授权',
    1001: '参数格式错误',
    1003: '登录超时',
    1004: 'Token 错误',
    1005: '用户更新错误',
    1006: '登录失败',
    1007: 'Ticket 为空',
    41004: '尚未配置 Secret，无法生成 token，需前往"系统管理-Secret与密码管理"完成配置后再使用'
}


// 创建axios实例
const service = axios.create({
	baseURL: HOST,
	timeout: 60000,
	withCredentials: false
})

// request拦截器
service.interceptors.request.use(
	config => {
		const token: string = `${localStorage.getItem('token') || ''}`
		if (token) { // @ts-ignore
            config.headers['Authorization'] = "Bearer " + token;
        }

        if (config.data && config.data.responseType == 'blob' ||
            // @ts-ignore
			config.url.indexOf('responseType=blob')>-1) {
			config.responseType = 'blob'
		}
        // // @ts-ignore
		// if (config.method.toLowerCase()=='get') {
        //     // @ts-ignore
		// 	let queryInfo:any = queryString.parseUrl(config.url);
		// 	let wheres = {...queryInfo.query};
		// 	delete wheres.page;
		// 	delete wheres.limit;
		// 	delete wheres.keywords;
		// 	queryInfo.query.wheres = JSON.stringify(wheres)
		// 	config.url = queryString.stringifyUrl(queryInfo)
		// }
		return config;
	},
	error => {
		console.log(error);
		Promise.reject(error);
	}
);

// respone拦截器
service.interceptors.response.use(
	(res) => {
		if (res.data instanceof Blob) {
			// 如果服务器错误返回
			if (res.data&&res.data.type === 'application/json') {
				let reader = new FileReader();
				reader.readAsText(res.data, 'utf-8');
				//同步加载返回错误消息
				return new Promise((resolve, reject) => {
					reader.onload = (e) => {
						if (typeof reader.result === "string") {
							reject(JSON.parse(reader.result));
						}
					}
				});
			}
			if(res.data&&res.data.size==0){
				return Promise.reject('下载文件为空')
			}
			let filename = '导出.xlsx';
			if (res.headers['content-disposition']) {
				let matches = res.headers['content-disposition'].match(/filename="?(.+)"?$/)
				if (matches && matches[1]) {
					filename = decodeURIComponent(matches[1])
				}
			}
			const url = window.URL.createObjectURL(res.data);
			const link = document.createElement('a');
			link.href = url;
			link.setAttribute('download', filename);
			document.body.appendChild(link);
			link.click();
			link.remove();
			return Promise.resolve(res)
		}
		res.data.status = res.data.code
		if (res.data.data === undefined) {
			let data = Object.assign({},res.data);
			delete data.code;
			delete data.msg;
			res.data.data = data;
		}
		if (res.data.data.records) {
			res.data.data.items = res.data.data.records;
		}
		// if (res.data.data.total) {
		// 	res.data.data.count = res.data.data.total;
		// 	delete res.data.data.total
		// }
		let code = res.data.code || res.data.status;
		// if (res.data.message == '') {
		// 	// amis 使用??判断，必须null或undefined
		// 	res.data.message = null
		// }
		// let msg = null;
		// if (res.data.msg) {
		// 	msg = res.data.msg
		// } else if (res.data.errors) {
		// 	msg = res.data.errors
		// } else if (res.data.message) {
		// 	msg = res.data.message
		// }
		console.log(res)
		// 请求成功
		if (code == 0) {
			// amis 成功状态必须为0
			res.data.status = 0
			return res;
		}
		// // Token鉴权失败
		if (code == 1003 ||code == 1004) {
            logout()
            MessagePlugin.error(errorMsg[code], 4000)
			return Promise.reject(res);
		} else if (code == 1002) {
            MessagePlugin.error(`${res.data}`, 4000)
            return Promise.reject(res);
        }
        MessagePlugin.error(errorMsg[code] || `系统错误，请稍后重试 code：${code}`, 4000)
		return Promise.reject(res);
	},
	error => {
		console.error(error)
        MessagePlugin.error(''+error)
		return Promise.reject()
	}
)

export default service;
